Monday, December 26, 2016

Bab 10. Soal & Penyelesaian C++


FUNGSI DAN KELAS SPESIAL





Soal & Penyelesaian
1.       Tulislah sebuah program C++ dimana di dalamnya terdapat anggota data statis.
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
//anggotaDataStatis.cpp
#include <iostream>
#include <conio.h>
using namespace std;

class Kucing
{
public:
    Kucing(int umur):umurNya(umur){BrpBanyakKucing++; }
    virtual ~Kucing() { BrpBanyakKucing--; }
    virtual int GetUmur() { return umurNya; }
    virtual void SetUmur(int umur) { umurNya = umur; }
    static int BrpBanyakKucing;

private:
    int umurNya;
};

int Kucing::BrpBanyakKucing = 0;

int main()
{
    const int KucingMaks = 5; int i;
    Kucing *RumahKucing[KucingMaks];

    for (i = 0; i < KucingMaks; i++)
        RumahKucing[i] = new Kucing(i);

    for (i = 0; i < KucingMaks; i++)
    {
        cout << "Terdapat ";
        cout << Kucing::BrpBanyakKucing;
        cout << " kucing!" << endl;
        cout << "Menghapus kucing yang berumur ";
        cout << RumahKucing[i]->GetUmur();
        cout << " tahun" << endl;
        delete RumahKucing[i];
        RumahKucing[i] = 0;
    }

    getch();
    return 0;
}

Terdapat 5 kucing!
Menghapus kucing yang berumur 0 tahun
Terdapat 4 kucing!
Menghapus kucing yang berumur 1 tahun
Terdapat 3 kucing!
Menghapus kucing yang berumur 2 tahun
Terdapat 2 kucing!
Menghapus kucing yang berumur 3 tahun
Terdapat 1 kucing!
Menghapus kucing yang berumur 4 tahun

2.       Demonstrasikanlah bagaimana mengakses anggota statis tanpa adanya objek.
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
//anggotaStatisTanpaObjek.cpp
#include <iostream>
#include <conio.h>
using namespace std;

class Kucing
{
public:
    Kucing(int umur):umurNya(umur){BrpBanyakKucing++; }
    virtual ~Kucing() { BrpBanyakKucing--; }
    virtual int GetUmur() { return umurNya; }
    virtual void SetUmur(int umur) { umurNya = umur; }
    static int BrpBanyakKucing;

private:
    int umurNya;
};

int Kucing::BrpBanyakKucing = 0;

void FungsiTelepati();

int main()
{
    const int KucingMaks = 5; int i;
    Kucing *RumahKucing[KucingMaks];

    for (i = 0; i < KucingMaks; i++)
    {
        RumahKucing[i] = new Kucing(i);
        FungsiTelepati();
    }

    for (i = 0; i < KucingMaks; i++)
    {
        delete RumahKucing[i];
        FungsiTelepati();
    }

    getch();
    return 0;
}

void FungsiTelepati()
{
    cout << "Terdapat ";
    cout << Kucing::BrpBanyakKucing << " kucing hidup!" << endl;
}

Terdapat 1 kucing hidup!
Terdapat 2 kucing hidup!
Terdapat 3 kucing hidup!
Terdapat 4 kucing hidup!
Terdapat 5 kucing hidup!
Terdapat 4 kucing hidup!
Terdapat 3 kucing hidup!
Terdapat 2 kucing hidup!
Terdapat 1 kucing hidup!
Terdapat 0 kucing hidup!

3.       Demonstrasikanlah pengaksesan anggota statis menggunakan fungsi anggota tak-statis.
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
//fungsiAnggotaTakStatis.cpp
#include <iostream>
#include <conio.h>
using namespace std;

class Kucing
{
public:
    Kucing(int umur):umurNya(umur){BrpBanyakKucing++; }
    virtual ~Kucing() { BrpBanyakKucing--; }
    virtual int GetUmur() { return umurNya; }
    virtual void SetUmur(int umur) { umurNya = umur; }
    virtual int GetBerapaBanyak() { return BrpBanyakKucing; }

private:
    int umurNya;
    static int BrpBanyakKucing;
};

int Kucing::BrpBanyakKucing = 0;

int main()
{
    const int KucingMaks = 5; int i;
    Kucing *RumahKucing[KucingMaks];

    for (i = 0; i < KucingMaks; i++)
        RumahKucing[i] = new Kucing(i);

    for (i = 0; i < KucingMaks; i++)
    {
        cout << "Terdapat ";
        cout << RumahKucing[i]->GetBerapaBanyak();
        cout << " kucing!" << endl;
        cout << "Menghapus kucing yang berumur ";
        cout << RumahKucing[i]->GetUmur()+2;
        cout << " tahun" << endl;
        delete RumahKucing[i];
        RumahKucing[i] = 0;
    }

    getch();
    return 0;
}

Terdapat 5 kucing!
Menghapus kucing yang berumur 2 tahun
Terdapat 4 kucing!
Menghapus kucing yang berumur 3 tahun
Terdapat 3 kucing!
Menghapus kucing yang berumur 4 tahun
Terdapat 2 kucing!
Menghapus kucing yang berumur 5 tahun
Terdapat 1 kucing!
Menghapus kucing yang berumur 6 tahun

4.       Demonstrasikanlah penggunaan fungsi anggota statis.
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
//fungsiAnggotaStatis.cpp
#include <iostream>
#include <conio.h>
using namespace std;

class Kucing
{
public:
    Kucing(int umur):umurNya(umur){BrpBanyakKucing++; }
    virtual ~Kucing() { BrpBanyakKucing--; }
    virtual int GetUmur() { return umurNya; }
    virtual void SetUmur(int umur) { umurNya = umur; }
    static int GetBerapaBanyak() { return BrpBanyakKucing; }

private:
    int umurNya;
    static int BrpBanyakKucing;
};

int Kucing::BrpBanyakKucing = 0;
void FungsiTelepati();

int main()
{
    const int KucingMaks = 5; int i;
    Kucing *RumahKucing[KucingMaks];

    for (i = 0; i < KucingMaks; i++)
    {
        RumahKucing[i] = new Kucing(i);
        FungsiTelepati();
    }

    for (i = 0; i < KucingMaks; i++)
    {
        delete RumahKucing[i];
        FungsiTelepati();
    }

    getch();
    return 0;
}

void FungsiTelepati()
{
    cout << "Terdapat ";
    cout << Kucing::GetBerapaBanyak() << " kucing hidup!" << endl;
}

Terdapat 1 kucing hidup!
Terdapat 2 kucing hidup!
Terdapat 3 kucing hidup!
Terdapat 4 kucing hidup!
Terdapat 5 kucing hidup!
Terdapat 4 kucing hidup!
Terdapat 3 kucing hidup!
Terdapat 2 kucing hidup!
Terdapat 1 kucing hidup!
Terdapat 0 kucing hidup!

5.       Demonstrasikanlah penggunaan pointer ke 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
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
//pointerKeFungsi.cpp
#include <iostream>
#include <conio.h>
using namespace std;

void Kuadrat (int&,int&);
void Kubik (int&, int&);
void Tukar (int&, int&);
void GetNilai(int&, int&);
void TampilNilai(int, int);

int main()
{
    void (* pFungsi) (int &, int &);
    bool fKeluar = false;

    int nilSatu=1, nilDua=2;
    int pilihan;
    while (fKeluar == false)
    {
        cout <<
            "(0)Keluar (1)Ubah Nilai (2)Kuadrat (3)Kubik (4)Tukar: ";
        cin >> pilihan;
        switch (pilihan)
        {
            case 1: pFungsi = GetNilai; break;
            case 2: pFungsi = Kuadrat; break;
            case 3: pFungsi = Kubik; break;
            case 4: pFungsi = Tukar; break;
            default: fKeluar = true; break;
        }

        if (fKeluar == false)
        {
            TampilNilai(nilSatu, nilDua);
            pFungsi(nilSatu, nilDua);
            TampilNilai(nilSatu, nilDua);
        }
    }

    getch();
    return 0;
 }

void TampilNilai(int x, int y)
{
    cout << "x: " << x << " y: " << y << endl;
}

void Kuadrat (int & rX, int & rY)
{
    rX *= rX;
    rY *= rY;
}

void Kubik (int & rX, int & rY)
{
    int tmp;

    tmp = rX;
    rX *= rX;
    rX = rX * tmp;

    tmp = rY;
    rY *= rY;
    rY = rY * tmp;
}

void Tukar(int & rX, int & rY)
{
    int temp;
    temp = rX;
    rX = rY;
    rY = temp;
}

void GetNilai (int & rNilaiSatu, int & rNilaiDua)
{
    cout << "Nilai baru untuk nilSatu: ";
    cin >> rNilaiSatu;
    cout << "Nilai baru untuk nilDua: ";
    cin >> rNilaiDua;
}

(0)Keluar (1)Ubah Nilai (2)Kuadrat (3)Kubik (4)Tukar: 1
x: 1 y: 2
Nilai baru untuk nilSatu: 12
Nilai baru untuk nilDua: 17
x: 12 y: 17

(0)Keluar (1)Ubah Nilai (2)Kuadrat (3)Kubik (4)Tukar: 2
x: 12 y: 17
x: 144 y: 289

(0)Keluar (1)Ubah Nilai (2)Kuadrat (3)Kubik (4)Tukar: 3
x: 144 y: 289
x: 2985984 y: 24137569

(0)Keluar (1)Ubah Nilai (2)Kuadrat (3)Kubik (4)Tukar: 4
x: 2985984 y: 24137569
x: 24137569 y: 2985984

(0)Keluar (1)Ubah Nilai (2)Kuadrat (3)Kubik (4)Tukar:

6.       Konversilah kode pada soal nomor 5 sehingga tidak perlu menggunakan pointer ke 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
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
//tanpaPointerKeFungsi.cpp
#include <iostream>
#include <conio.h>
using namespace std;

void Kuadrat (int&,int&);
void Kubik (int&, int&);
void Tukar (int&, int&);
void GetNilai(int&, int&);
void TampilNilai(int, int);

int main()
{
    bool fKeluar = false;
    int nilSatu=1, nilDua=2;
    int pilihan;
    while (fKeluar == false)
    {
        cout <<
            "(0)Keluar (1)Ubah Nilai (2)Kuadrat (3)Kubik (4)Tukar: ";
        cin >> pilihan;
        switch (pilihan)
        {
            case 1:
                TampilNilai(nilSatu, nilDua);
                GetNilai(nilSatu, nilDua);
                TampilNilai(nilSatu, nilDua);
                break;

            case 2:
                TampilNilai(nilSatu, nilDua);
                Kuadrat(nilSatu,nilDua);
                TampilNilai(nilSatu, nilDua);
                break;

            case 3:
                 TampilNilai(nilSatu, nilDua);
                 Kubik(nilSatu, nilDua);
                 TampilNilai(nilSatu, nilDua);
                 break;

            case 4:
                TampilNilai(nilSatu, nilDua);
                Tukar(nilSatu, nilDua);
                TampilNilai(nilSatu, nilDua);
                break;

            default: fKeluar = true; break;
        }
    }

    getch();
    return 0;
 }

void TampilNilai(int x, int y)
{
    cout << "x: " << x << " y: " << y << endl;
}

void Kuadrat (int & rX, int & rY)
{
    rX *= rX;
    rY *= rY;
}

void Kubik (int & rX, int & rY)
{
    int tmp;

    tmp = rX;
    rX *= rX;
    rX = rX * tmp;

    tmp = rY;
    rY *= rY;
    rY = rY * tmp;
}

void Tukar(int & rX, int & rY)
{
    int temp;
    temp = rX;
    rX = rY;
    rY = temp;
}

void GetNilai (int & rNilaiSatu, int & rNilaiDua)
{
    cout << "Nilai baru untuk nilSatu: ";
    cin >> rNilaiSatu;
    cout << "Nilai baru untuk nilDua: ";
    cin >> rNilaiDua;
}

(0)Keluar (1)Ubah Nilai (2)Kuadrat (3)Kubik (4)Tukar: 1
x: 1 y: 2
Nilai baru untuk nilSatu: 12
Nilai baru untuk nilDua: 13
x: 12 y: 13

(0)Keluar (1)Ubah Nilai (2)Kuadrat (3)Kubik (4)Tukar: 2
x: 12 y: 13
x: 144 y: 169

(0)Keluar (1)Ubah Nilai (2)Kuadrat (3)Kubik (4)Tukar: 3
x: 144 y: 169
x: 2985984 y: 4826809

(0)Keluar (1)Ubah Nilai (2)Kuadrat (3)Kubik (4)Tukar: 4
x: 2985984 y: 4826809
x: 4826809 y: 2985984

(0)Keluar (1)Ubah Nilai (2)Kuadrat (3)Kubik (4)Tukar:

7.       Demonstrasikanlah penggunaan array pointer ke 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
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
//arrayPointerKeFungsi.cpp
#include <iostream>
#include <conio.h>
using namespace std;

void Kuadrat (int&,int&);
void Kubik (int&, int&);
void Tukar (int&, int&);
void GetNilai(int&, int&);
void TampilNilai(int, int);

int main()
{
    int nilSatu=1, nilDua=2;
    int pilihan, i;
    const int ArrayMaks = 5;
    void (*pArrayFungsi[ArrayMaks])(int&, int&);

    for (i=0; i < ArrayMaks; i++)
    {
        cout <<"(0)Keluar (1)Ubah Nilai (2)Kuadrat (3)Kubik (4)Tukar: ";
        cin >> pilihan;
        switch (pilihan)
        {
            case 1: pArrayFungsi[i] = GetNilai; break;
            case 2: pArrayFungsi[i] = Kuadrat; break;
            case 3: pArrayFungsi[i] = Kubik; break;
            case 4: pArrayFungsi[i] = Tukar; break;
            default: pArrayFungsi[i] = 0;
        }
    }

    for (i=0; i < ArrayMaks; i++)
    {
        if ( pArrayFungsi[i] == 0 )
            continue;
        pArrayFungsi[i](nilSatu,nilDua);
        TampilNilai(nilSatu,nilDua);
   }

    getch();
    return 0;
 }

void TampilNilai(int x, int y)
{
    cout << "x: " << x << " y: " << y << endl;
}

void Kuadrat (int & rX, int & rY)
{
    rX *= rX;
    rY *= rY;
}

void Kubik (int & rX, int & rY)
{
    int tmp;

    tmp = rX;
    rX *= rX;
    rX = rX * tmp;

    tmp = rY;
    rY *= rY;
    rY = rY * tmp;
}

void Tukar(int & rX, int & rY)
{
    int temp;
    temp = rX;
    rX = rY;
    rY = temp;
}

void GetNilai (int & rNilaiSatu, int & rNilaiDua)
{
    cout << "Nilai baru untuk nilSatu: ";
    cin >> rNilaiSatu;
    cout << "Nilai baru untuk nilDua: ";
    cin >> rNilaiDua;
}

(0)Keluar (1)Ubah Nilai (2)Kuadrat (3)Kubik (4)Tukar: 1
(0)Keluar (1)Ubah Nilai (2)Kuadrat (3)Kubik (4)Tukar: 2
(0)Keluar (1)Ubah Nilai (2)Kuadrat (3)Kubik (4)Tukar: 3
(0)Keluar (1)Ubah Nilai (2)Kuadrat (3)Kubik (4)Tukar: 4
(0)Keluar (1)Ubah Nilai (2)Kuadrat (3)Kubik (4)Tukar: 1
Nilai baru untuk nilSatu: 12
Nilai baru untuk nilDua: 13
x: 12 y: 13
x: 144 y: 169
x: 2985984 y: 4826809
x: 4826809 y: 2985984
Nilai baru untuk nilSatu:

8.       Demonstrasikanlah pelewatan pointer ke fungsi kepada fungsi lain.
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
//pelewatanPointerKeFungsi.cpp
#include <iostream>
#include <conio.h>
using namespace std;

void Kuadrat (int&,int&);
void Kubik (int&, int&);
void Tukar (int&, int&);
void GetNilai(int&, int&);
void TampilNilai(void (*)(int&, int&),int&, int&);

int main()
{
    int nilSatu=1, nilDua=2;
    int pilihan, i;

    bool fKeluar = false;

    void (*pFungsi)(int&, int&);

    while (fKeluar == false)
    {
        cout <<"(0)Keluar (1)Ubah Nilai (2)Kuadrat (3)Kubik (4)Tukar: ";
        cin >> pilihan;
        switch (pilihan)
        {
            case 1: pFungsi = GetNilai; break;
            case 2: pFungsi = Kuadrat; break;
            case 3: pFungsi = Kubik; break;
            case 4: pFungsi = Tukar; break;
            default: fKeluar = true; break;
        }

        if (fKeluar == false)
            TampilNilai ( pFungsi, nilSatu, nilDua);
    }

    getch();
    return 0;
 }

void TampilNilai(void (*pFungsi)(int&, int&), int& x, int& y)
{
    cout << "x: " << x << " y: " << y << endl;
       pFungsi(x,y);
    cout << "x: " << x << " y: " << y << endl;
}

void Kuadrat (int & rX, int & rY)
{
    rX *= rX;
    rY *= rY;
}

void Kubik (int & rX, int & rY)
{
    int tmp;

    tmp = rX;
    rX *= rX;
    rX = rX * tmp;

    tmp = rY;
    rY *= rY;
    rY = rY * tmp;
}

void Tukar(int & rX, int & rY)
{
    int temp;
    temp = rX;
    rX = rY;
    rY = temp;
}

void GetNilai (int & rNilaiSatu, int & rNilaiDua)
{
    cout << "Nilai baru untuk nilSatu: ";
    cin >> rNilaiSatu;
    cout << "Nilai baru untuk nilDua: ";
    cin >> rNilaiDua;
}

(0)Keluar (1)Ubah Nilai (2)Kuadrat (3)Kubik (4)Tukar: 1
x: 1 y: 2
Nilai baru untuk nilSatu: 12
Nilai baru untuk nilDua: 13
x: 12 y: 13

(0)Keluar (1)Ubah Nilai (2)Kuadrat (3)Kubik (4)Tukar: 2
x: 12 y: 13
x: 144 y: 169

(0)Keluar (1)Ubah Nilai (2)Kuadrat (3)Kubik (4)Tukar: 3
x: 144 y: 169
x: 2985984 y: 4826809

(0)Keluar (1)Ubah Nilai (2)Kuadrat (3)Kubik (4)Tukar: 4
x: 2985984 y: 4826809
x: 4826809 y: 2985984

(0)Keluar (1)Ubah Nilai (2)Kuadrat (3)Kubik (4)Tukar:

9.       Demonstrasikanlah penggunaan typedef pada pointer ke 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
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
//typedefPointerKeFungsi.cpp
#include <iostream>
#include <conio.h>
using namespace std;

void Kuadrat (int&,int&);
void Kubik (int&, int&);
void Tukar (int&, int&);
void GetNilai(int&, int&);
typedef void (*VPF) (int&, int&) ;
void TampilNilai(VPF, int&, int&);

int main()
{
    int nilSatu=1, nilDua=2;
    int pilihan, i;

    bool fKeluar = false;

    VPF pFungsi;

    while (fKeluar == false)
    {
        cout <<"(0)Keluar (1)Ubah Nilai (2)Kuadrat (3)Kubik (4)Tukar: ";
        cin >> pilihan;
        switch (pilihan)
        {
            case 1: pFungsi = GetNilai; break;
            case 2: pFungsi = Kuadrat; break;
            case 3: pFungsi = Kubik; break;
            case 4: pFungsi = Tukar; break;
            default: fKeluar = true; break;
        }

        if (fKeluar == false)
            TampilNilai ( pFungsi, nilSatu, nilDua);
    }

    getch();
    return 0;
 }

void TampilNilai(VPF pFungsi, int& x, int& y)
{
    cout << "x: " << x << " y: " << y << endl;
    pFungsi(x,y);
    cout << "x: " << x << " y: " << y << endl;
}

void Kuadrat (int & rX, int & rY)
{
    rX *= rX;
    rY *= rY;
}

void Kubik (int & rX, int & rY)
{
    int tmp;

    tmp = rX;
    rX *= rX;
    rX = rX * tmp;

    tmp = rY;
    rY *= rY;
    rY = rY * tmp;
}

void Tukar(int & rX, int & rY)
{
    int temp;
    temp = rX;
    rX = rY;
    rY = temp;
}

void GetNilai (int & rNilaiSatu, int & rNilaiDua)
{
    cout << "Nilai baru untuk nilSatu: ";
    cin >> rNilaiSatu;
    cout << "Nilai baru untuk nilDua: ";
    cin >> rNilaiDua;
}

(0)Keluar (1)Ubah Nilai (2)Kuadrat (3)Kubik (4)Tukar: 1
x: 1 y: 2
Nilai baru untuk nilSatu: 12
Nilai baru untuk nilDua: 13
x: 12 y: 13

(0)Keluar (1)Ubah Nilai (2)Kuadrat (3)Kubik (4)Tukar: 2
x: 12 y: 13
x: 144 y: 169

(0)Keluar (1)Ubah Nilai (2)Kuadrat (3)Kubik (4)Tukar: 3
x: 144 y: 169
x: 2985984 y: 4826809

(0)Keluar (1)Ubah Nilai (2)Kuadrat (3)Kubik (4)Tukar: 4
x: 2985984 y: 4826809
x: 4826809 y: 2985984

(0)Keluar (1)Ubah Nilai (2)Kuadrat (3)Kubik (4)Tukar:

10.    Demonstrasikanlah penggunaan pointer ke fungsi anggota.
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
//pointerKeFungsiAnggota.cpp
#include <iostream>
#include <conio.h>
using namespace std;

class Mammal
{
public:
    Mammal():umurNya(1) { }
    virtual ~Mammal() { }
    virtual void Bicara() const = 0;
    virtual void Bergerak() const = 0;

protected:
    int umurNya;
};

class Anjing : public Mammal
{
 public:
 void Bicara()const { cout << "Guk Guk!" << endl; }
 void Bergerak() const { cout << "Berjalan melenggok..." << endl; }
};


class Kucing : public Mammal
{
public:
    void Bicara()const { cout << "Meonk Meonk!" << endl; }
    void Bergerak() const { cout << "Berlari..." << endl; }
};

class Kuda : public Mammal
{
public:
    void Bicara()const { cout << "Husshhhaaa!" << endl; }
    void Bergerak() const { cout << "Berlari kencang..." << endl; }
};

int main()
{
    void (Mammal::*pFungsi)() const = 0;
    Mammal* ptr =0;
    int Binatang;
    int Metode;
    bool fKeluar = false;

    while (fKeluar == false)
    {
        cout << "(0)Keluar (1)Anjing (2)Kucing (3)Kuda: ";
        cin >> Binatang;
        switch (Binatang)
        {
            case 1: ptr = new Anjing; break;
            case 2: ptr = new Kucing; break;
            case 3: ptr = new Kuda; break;
            default: fKeluar = true; break;
        }

        if (fKeluar == false)
        {
            cout << "(1)Bicara (2)Bergerak: ";
            cin >> Metode;
            switch (Metode)
            {
                case 1: pFungsi = &Mammal::Bicara; break;
                case 2: pFungsi = &Mammal::Bergerak; break;
            }

            (ptr->*pFungsi)();
            delete ptr;
        }
    }

       getch();
       return 0;
}

(0)Keluar (1)Anjing (2)Kucing (3)Kuda: 1
(1)Bicara (2)Bergerak: 1
Guk Guk!

(0)Keluar (1)Anjing (2)Kucing (3)Kuda: 2
(1)Bicara (2)Bergerak: 2
Berlari...

(0)Keluar (1)Anjing (2)Kucing (3)Kuda: 3
(1)Bicara (2)Bergerak: 1
Husshhhaaa!

(0)Keluar (1)Anjing (2)Kucing (3)Kuda:

11.    Demonstrasikanlah penggunaan array pointer ke fungsi anggota.
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
//arrayPointerKeFungsiAnggota.cpp
#include <iostream>
#include <conio.h>
using std::cout;
using std::endl;

class Anjing
{
public:
    void Bicara()const { cout << "Guk Guk!" << endl; }
    void Bergerak() const { cout << "Mencari perhatian..." << endl; }
    void Makan() const { cout << "Menelan makanan..." << endl; }
    void Mengendus() const { cout << "Shhhgrrgrg" << endl; }
    void Mengeluh() const { cout << "Mengeluh..." << endl; }
    void Berguling() const { cout << "Berguling-guling..." << endl; }
    void Pura_PuraMati() const
    { cout << "Bermain pura-pura mati" << endl; }
};

typedef void (Anjing::*PDF)()const ;

int main()
{
    const int FungsiMaks = 7;
    PDF FungsiAnjing[FungsiMaks] =
    {&Anjing::Bicara,
     &Anjing::Bergerak,
     &Anjing::Makan,
     &Anjing::Mengendus,
     &Anjing::Mengeluh,
     &Anjing::Berguling,
     &Anjing::Pura_PuraMati };

     Anjing* pAnjing =0;

    int Metode;
     bool fKeluar = false;

    while (!fKeluar)
    {
        cout << "(0)Keluar (1)Bicara (2)Bergerak (3)Makan (4)Mengendus";
        cout << " (5)Mengeluh (6)Berguling (7)Pura-Pura Mati: ";
        std::cin >> Metode;
        if (Metode <= 0 || Metode >= 8)
        {
            fKeluar = true;
        }

        else
        {
            pAnjing = new Anjing;
            (pAnjing->*FungsiAnjing[Metode-1])();
            delete pAnjing;
        }
    }

       getch();
       return 0;
}

(0)Keluar (1)Bicara (2)Bergerak (3)Makan (4)Mengendus (5)Mengeluh (6)Berguling (7)Pura-Pura Mati: 1
Guk Guk!

(0)Keluar (1)Bicara (2)Bergerak (3)Makan (4)Mengendus (5)Mengeluh (6)Berguling (7)Pura-Pura Mati: 2
Mencari perhatian...

(0)Keluar (1)Bicara (2)Bergerak (3)Makan (4)Mengendus (5)Mengeluh (6)Berguling (7)Pura-Pura Mati: 3
Menelan makanan...

(0)Keluar (1)Bicara (2)Bergerak (3)Makan (4)Mengendus (5)Mengeluh (6)Berguling (7)Pura-Pura Mati: 4
Shhhgrrgrg

(0)Keluar (1)Bicara (2)Bergerak (3)Makan (4)Mengendus (5)Mengeluh (6)Berguling (7)Pura-Pura Mati: 5
Mengeluh...

(0)Keluar (1)Bicara (2)Bergerak (3)Makan (4)Mengendus (5)Mengeluh (6)Berguling (7)Pura-Pura Mati: 6
Berguling-guling...

(0)Keluar (1)Bicara (2)Bergerak (3)Makan (4)Mengendus (5)Mengeluh (6)Berguling (7)Pura-Pura Mati: 7
Bermain pura-pura mati

(0)Keluar (1)Bicara (2)Bergerak (3)Makan (4)Mengendus (5)Mengeluh (6)Berguling (7)Pura-Pura Mati:0



No comments:

Post a Comment